package generator

import (
	"fmt"
	"generator-tool/config"
	"text/template"
)

type TemplateLoader struct {
	templateDir string
	templates   *template.Template
}

var defaultTemplateDir = "templates"

func (tl *TemplateLoader) loadTemplates() error {
	// 定义模板文件路径
	templateFiles := []string{
		tl.templateDir + "/model.tpl",
		tl.templateDir + "/repository.tpl",
		tl.templateDir + "/service.tpl",
		tl.templateDir + "/controller.tpl",
		tl.templateDir + "/router.tpl",
		tl.templateDir + "/database.tpl",     // 新增数据库模板
		tl.templateDir + "/main_example.tpl", // 新增使用示例模板
	}

	// 创建模板并解析文件
	tmpl := template.New("generator").Funcs(template.FuncMap{
		"toLower": func(s string) string {
			if len(s) == 0 {
				return s
			}
			first := s[0]
			if first >= 'A' && first <= 'Z' {
				first = first + 32
			}
			return string(first) + s[1:]
		},
		"plural": func(s string) string {
			return s + "s"
		},
		"getDSN": func(cfg *config.DatabaseConfig) string {
			return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
				cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.Database, cfg.Charset)
		},
	})

	var err error
	tl.templates, err = tmpl.ParseFiles(templateFiles...)
	if err != nil {
		return fmt.Errorf("解析模板文件失败: %v", err)
	}

	return nil
}

func (tl *TemplateLoader) GetTemplate(name string) *template.Template {
	return tl.templates.Lookup(name)
}

func (tl *TemplateLoader) ExecuteTemplate(name string, data interface{}) (string, error) {
	tmpl := tl.GetTemplate(name)
	if tmpl == nil {
		return "", fmt.Errorf("模板 %s 不存在", name)
	}

	// 执行模板到字符串
	// 这里可以使用 bytes.Buffer 来捕获输出
	return "", nil // 实际实现会在 code_generator.go 中处理
}

// SetTemplateDir 设置默认模板目录（包级别函数）
func SetTemplateDir(dir string) {
	defaultTemplateDir = dir
}

// GetTemplateDir 获取默认模板目录
func GetTemplateDir() string {
	return defaultTemplateDir
}

func NewTemplateLoader(templateDir string) (*TemplateLoader, error) {
	// 如果传入空字符串，使用默认目录
	if templateDir == "" {
		templateDir = defaultTemplateDir
	}

	loader := &TemplateLoader{
		templateDir: templateDir,
	}

	if err := loader.loadTemplates(); err != nil {
		return nil, fmt.Errorf("加载模板失败: %v", err)
	}

	return loader, nil
}
